package main

// Go 在多个 crypto/* 包中实现了一系列散列函数
import (
	"crypto/md5"
	"crypto/sha1"
	"crypto/sha256"
)
import "fmt"

func main() {
	s := "sha1 this string"

	// 产生一个散列值的方式是 sha1.New()，sha1.Write(bytes)，然后 sha1.Sum([]byte{})
	h := sha1.New()

	// 写入要处理的字节。如果是一个字符串，需要使用[]byte(s) 来强制转换成字节数组。
	h.Write([]byte(s))

	// 这个用来得到最终的散列值的字节切片。Sum 的参数可以用来给现有的字符切片追加额外的字节切片：一般不需要要。
	bs := h.Sum(nil)

	// SHA1 值经常以 16 进制输出(%x)，例如在 git commit 中。使用%x 来将散列结果格式化为 16 进制字符串。
	// 40位小写的16进制字符串
	fmt.Printf("%x\n", bs) // cf23df2207d99a74fbe169e3eba035e633b65d94

	m := md5.New()
	m.Write([]byte("md5 this string"))
	bm := m.Sum(nil)
	// 32位小写的16进制字符串
	fmt.Printf("%x\n", bm) // d77bff3a550c1bf39b78ad2136c5d604

	s256 := sha256.New()
	s256.Write([]byte("sha256 this string"))
	bs256 := s256.Sum(nil)
	// 64位小写的16进制字符串
	fmt.Printf("%x\n", bs256) // 1af1dfa857bf1d8814fe1af8983c18080019922e557f15a8a0d3db739d77aacb

}
